/*
* main.c - Mokri
* Contributors: xMine
* (Any new Contributor may add himself/herself to the list)
*/

#include "main.h"

inline unsigned int power (unsigned int zahl, int exponent) {
	int i;
	unsigned int z = zahl;
	for (i=0; i<exponent; i++) {
		z *= zahl;
	}
	
	return z;
}

/* Konvertiert eine Zahl in einen lesbaren char-Array
 * Parameter: Zahl, Basis (bis zu 36)
 * Rückgaben: String, bei Fehlern NULL
 */
char *int2str (int zahl, int basis) {
	BOOL negativ = FALSE;
	
	if (zahl < 0) {
		zahl = -zahl;
		negativ = TRUE;
	}
	
	return int2str_intern ((uint64_t)zahl, basis, negativ);
}

char *uint2str (uint64_t zahl, int basis) {
	return int2str_intern (zahl, basis, FALSE);
}

char *int2str_intern (uint64_t zahl, int basis, BOOL negativ) {
	if (basis < 2 || basis > 36) { // Bei komischen Basen NULL returnen
		return NULL;
	}
	
	int len = 0; // Länge der Zahl auslesen
	int z = zahl;
	
	if (negativ) { // Sollte die Zahl negativ sein, drehen wir sie hier einmal um
		len++; // Extra Zeichen fürs -
	}
	
	if (zahl >= 0 && zahl < basis) {
		len = 1;
	} else {
		for (len=0; z != 0; z /= basis, len++) {}
	}
	
	// Hier angekommen sollten wir genügend informationen über die Zahl haben :)
	char *zeichen = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Erleichtert das richtige Zeichen für die Zahl zu finden
	char *ret = (char*) malloc (len+1);
	int pos = 0; // Position im String
	int p = 0;   // Position in der Zahl
	int cur;     // Aktuelle Zahl
	int div = power (basis, len-2); // Divisor x^y
	
	memset (ret, 0x0, len+1); // String nullen
	
	if (negativ) { // Ggf. ein Minus hinzufügen
		ret[0] = (char)'-';
		pos++;
	}
	
	z = zahl;
	
	if (z >= 0 && z < basis) {
		ret[pos] = zeichen[z];
	} else {
		for (; p < len; p++, pos++) {
			cur = z/div;
			
			ret[pos] = zeichen[cur];
			
			z -= cur * power(basis, len-p-2);
			div /= basis;
		}
	}
	
	return ret;
}

char *cits (int zahl) {
	return int2str (zahl, 10);
}

